"""
@filename=utils.py
@version=0.1.0.20240110
@author=amnotgcs
@createTime=20240110 20:11
@lastModifiedTime=20240110 20:11
@description=实用工具类
"""
import os
import string
import logging
from urllib import parse

from parsel import Selector


SERVER_URL = 'https://bidding.sinopec.com/'


def safe_filename(filename: str) -> str:
    """去除文件名中的特殊字符,并限制长度"""
    trans = str.maketrans({char: None for char in string.punctuation})
    return filename.translate(trans)[:250]


def is_folder_exists(folder: str) -> bool:
    """文件夹是否存在
    
    Parameters
    ----------
    folder : str
        文件夹名

    Returns
    -------
    True
        文件夹存在
        文件不存在但尝试创建成功了
    False
        文件夹不存在且创建失败了

    Notes
    -----
    如果要创建的文件夹已存在同名文件,会尝试删除
    """
    if os.path.isfile(folder):
        logging.info(f'将尝试创建{folder}文件夹')
        os.remove(folder)
    if not os.path.isdir(folder):
        try:
            os.mkdir(folder)
        except FileExistsError as e:
            logging.error(f'{folder}文件夹不存在且创建失败了, {e}')
            return False
    return True


def parse_bidding_list_of_html(html: str) -> list:
    """
    解析指定HTML页面,获取所有bidding的超链接
    
    Parameters
    ----------
    html : str
        网页HTML源码字符串
    
    Returns
    -------
    list
        当前页面的bidding信息
        列表内是字典,包含bidding的标题和链接
    """
    bidding_info_list = []
    selector = Selector(html)
    table_tr_list = selector.xpath('//table[@id="MoreinfoListsearch1_DataGrid1"]/tr')
    # 解析网页内的招标文件列表
    for tr in table_tr_list:
        tr_info = tr.xpath('td[2]/div/a')
        tr_date = tr.xpath('td[3]/text()')
        tr_date = tr_date.get().strip() if tr_date else ''
        bidding_info_list.append({
            'title': tr_info.xpath('@title').get(),
            'href': parse.urljoin(SERVER_URL, tr_info.xpath('@href').get()),
            'date': tr_date,
        })
    return bidding_info_list


def parse_pdf_link_in_bidding_html(html: str) -> dict:
    """
    解析出bidding网页内的pdf标题和链接

    Parameters
    ----------
    html : str
        网页HTML源码字符串
    
    Returns
    -------
    dict
        包含pdf标题的链接的字典
    """
    selector = Selector(html)
    title = selector.xpath('//td[@id="tdTitle"]/font/b/text()').get()
    pdf_link = selector.xpath('//font[text()="招标公告.pdf"]/parent::a/@href').get()
    return {
        'title': title.strip() if title else None,
        'pdf_link': pdf_link,
    }
